// cf-86d
// 题意：给定n(<=200000)个数，m(<=200000)个询问，每次询问[l, r]区间，
//       设k[s]表示s这个数在这段区间出现的次数，每次询问就是要输出
//       sigma(k[s]*k[s]*s)。
//
// 题解：很经典的可以套用莫队算法。
//       
// run: $exec < input
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

int const maxn = 2000007;
int const size = std::sqrt(maxn);
int count[1000007];
long long ans[maxn];
int a[maxn];
int n, m;

struct query { int l, r, id; };
std::vector<query> q;
long long cur_ans;

bool operator<(query const & a, query const & b)
{
	if (a.l / size != b.l / size) return a.l < b.l;
	else return (a.r < b.r) ^ ((a.l / size) & 1);
}

void add(long long s)
{
	cur_ans += 2 * s * count[s] + s;
	count[s]++;
}

void remove(long long s)
{
	cur_ans -= 2 * s * count[s] - s;
	count[s]--;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> m;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	q.resize(m);
	for (int i = 0; i < m; i++) {
		std::cin >> q[i].l >> q[i].r;
		q[i].id = i;
	}
	std::sort(q.begin(), q.end());

	int l = 0, r = 0;
	for (int i = 0; i < m; i++) {
		while (l < q[i].l) remove(a[l++]);
		while (l > q[i].l) add(a[--l]);
		while (r > q[i].r) remove(a[r--]);
		while (r < q[i].r) add(a[++r]);
		ans[q[i].id] = cur_ans;
	}
	for (int i = 0; i < m; i++)
		std::cout << ans[i] << '\n';
}

